<?php

/**
 * Api para administrar los productos que se almacenan en una sesion
 * 
 * Con esta api, se podrá agregar, quitar y obtener los producto almacenados
 * en una sesión. Las sesiones se identifican por medio de un token.
 *
 */
class PapiWS_Service_SessionProduct
{
	/**
	 *	Obtiene un producto a partir de la session
	 *
	 * @param string $token Session token
	 * @param integer $personalizedProductId Id del producto. Se es null 
	 *    devuelve todos los productos  de la sesion.
	 * @return mixed VO del producto o un array si hay más de uno 
	 */
	public function getProduct( $token, $personalizedProductId = 0 ) 
	{
		$token = $this->validateToken( $token );

		$smodel = new PapiWS_Model_SessionProduct();
		$row = $smodel->find( $token )->current();
		$select = $smodel
					->select()
					->where( 'token = ?' , $token)
					->order( 'creation_date desc' ); 
		$rows = $smodel->fetchAll( $select );
		if ( count($rows) == 0 ) {
			return null;
		}

		$found = false;
		foreach( $rows as $row ) {
			if ( $personalizedProductId == 0 ) {
				$personalizedProductId = $row->personalized_product_id;
				$found = true;		
				break;
			} else {
				if ( $personalizedProductId == $row->personalized_product_id ) {
					$found = true;		
					break;
				}
			}
		}

		// if not found return
		if ( ! $found ) {
			return null;
		}

		$pmodel = new PapiWS_Service_PersonalizedProduct();
		return $pmodel->getProduct( $personalizedProductId );
	}

	/**
	 * Agrega el producto a la sesión especificada por el token.
	 *
	 * @param integer $personalizedProductId Id del producto a agregar.
	 * @param string $token Identificador de la sesión
	 * @return boolean true on success or false on error.
	 */
	public function addProduct( $personalizedProductId, $token ) {

		if ( (int) $personalizedProductId == 0 ) {
			throw new Ext_Exception( 'Id de product inválido' );
		}

		$token = $this->validateToken( $token );

		// lo borramos si existe
		$this->removeProduct( $personalizedProductId, $token );

		// insertamos reg
		$smodel = new PapiWS_Model_SessionProduct();
		$row = $smodel->createRow();
		$row->creation_date = Ext_Db_Date::now();
		$row->token = $token;
		$row->personalized_product_id = (int) $personalizedProductId;
		$row->save();

		return true;
	}

	/**
	 * Saca el producto especificado de la sesión
	 *
	 * @param integer $personalizedProductId Producto a agregar.
	 * @param string $token Identificador de la sesión
	 * @return boolean true si el producto se sacó con éxito
	 */
	public function removeProduct( $personalizedProductId, $token ) {

		$token = $this->validateToken( $token );

		// create session product
		$smodel = new PapiWS_Model_SessionProduct();

		// borramos el registro si existe
		$where = $smodel->getAdapter()->quoteInto(
			'personalized_product_id = ? and token = ?' , 
			(int) $personalizedProductId,
			$token);
		$smodel->delete( $where );

		return true;
	}

	/**
	 * Valida el token
	 *
	 * @param string $token El token a validar
	 * @return string El token trimeado o arroja una excepción
	 */
	private function validateToken( $token ) {
		// validar token. Por ahora sólo pedimos q no sea un string de tamaño 0.
		if ( strlen( trim( $token ) )  == 0 ) {
			throw new Ext_Exception( 'El token no es un string valido!' );
		}
		return trim($token);
	}
}
